﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using Entidades;
using System.Data;
using System.Data.Common;

namespace DAO
{
    public class InvestigadorDAO : DAOBase
    {
        private const string InsertProcedure = "PR_INVESTIGADOR_I";
        private const string UpdateProcedure = "PR_INVESTIGADOR_U";
        private const string SelectProcedure = "PR_INVESTIGADOR_S";
        private const string SelectAllProcedure = "PR_INVESTIGADOR_SA";
        private const string DeleteProcedure = "PR_INVESTIGADOR_D";
        private const string SearchProcedure = "PR_INVESTIGADOR_SEARCH";
        private const string LoginProcedure = "PR_INVESTIGADOR_LOGIN";

		public InvestigadorDAO() : base() {}

        #region VirtualProcedures

        public override string obtainInsertProcedure()
        {
            return InsertProcedure;
        }

        public override string obtainDeleteProcedure()
        {
            return DeleteProcedure;
        }

        public override string obtainUpdateProcedure()
        {
            return UpdateProcedure;
        }

        public override string obtainSelectProcedure()
        {
            return SelectProcedure;
        }

        public override string obtainSelectAllProcedure()
        {
            return SelectAllProcedure;
        }

        public override string obtainSearchProcedure()
        {
            return SearchProcedure;
        }

        public string obtainLoginProcedure()
        {
            return LoginProcedure;
        }

        #endregion

        #region IDAO Members

        public override void cargarEntidad(EntidadBase entidad, IDataReader reader)
        {
            EntidadInvestigador investigador = (EntidadInvestigador)entidad;
            object tempValue;
            // Campo Id
            investigador.Id = Convert.ToInt32(reader["id_investigador"]);
            // Resto de campos
            tempValue = reader["nombreYApellido"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.NombreYApellido = "";
            }
            else
            {
                investigador.NombreYApellido = Convert.ToString(tempValue);
            }

            tempValue = reader["dni"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.Dni = "";
            }
            else
            {
                investigador.Dni = Convert.ToString(tempValue);
            }

            tempValue = reader["legajo"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.Legajo = "";
            }
            else
            {
                investigador.Legajo = Convert.ToString(tempValue);
            }

            tempValue = reader["telefonoFijo"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.TelefonoFijo = "";
            }
            else
            {
                investigador.TelefonoFijo = Convert.ToString(tempValue);
            }

            tempValue = reader["telefonoCelular"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.TelefonoCelular = "";
            }
            else
            {
                investigador.TelefonoCelular = Convert.ToString(tempValue);
            }

            tempValue = reader["sitioWeb"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.SitioWeb = "";
            }
            else
            {
                investigador.SitioWeb = Convert.ToString(tempValue);
            }

            tempValue = reader["mail"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.Mail = "";
            }
            else
            {
                investigador.Mail = Convert.ToString(tempValue);
            }

            tempValue = reader["direccion"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.Direccion = "";
            }
            else
            {
                investigador.Direccion = Convert.ToString(tempValue);
            }

            tempValue = reader["huella"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.Huella = "";
            }
            else
            {
                investigador.Huella = Convert.ToString(tempValue);
            }

            tempValue = reader["imagen"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.Imagen = "";
            }
            else
            {
                investigador.Imagen = Convert.ToString(tempValue);
            }

            tempValue = reader["userName"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.UserName = "";
            }
            else
            {
                investigador.UserName = Convert.ToString(tempValue);
            }

            tempValue = reader["password"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.Password = "";
            }
            else
            {
                investigador.Password = Convert.ToString(tempValue);
            }

            tempValue = reader["esEncargado"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.EsEncargado = null;
            }
            else
            {
                investigador.EsEncargado = Convert.ToBoolean(tempValue);
            }
            
            tempValue = reader["fk_id_barrio"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.Barrio.Id = 0;
            }
            else
            {
                investigador.Barrio.Id = Convert.ToInt32(tempValue);
            }

            tempValue = reader["activo"];
            if (tempValue.Equals(DBNull.Value))
            {
                investigador.Activo = null;
            }
            else
            {
                investigador.Activo = Convert.ToBoolean(tempValue);
            }
            
        }

        public override List<EntidadBase> cargar(IDataReader reader)
        {
            // Creo la lista vacia
            List<EntidadBase> listaEntidades = new List<EntidadBase>();
            // Itero en el data reader y cargo los datos basicos
            while (reader.Read())
            {
                EntidadInvestigador entity = new EntidadInvestigador();
                cargarEntidad(entity, reader);
                listaEntidades.Add(entity);
            }

            reader.Close();

            return listaEntidades;
        }

        public EntidadBase checkLogin(EntidadBase entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentException();
            }

            bool opened = false;

            try
            {
                if (this.dalObject.IsConnectionClosed)
                {
                    opened = true;
                    this.dalObject.Open();
                }

                // Creo el comando
                IDbCommand cmd = null;
                EntidadInvestigador investigador = (EntidadInvestigador)entidad;
                cmd = dalObject.BuildCommand(this.obtainLoginProcedure(), 
                    new object[] { investigador.UserName, investigador.Password });

                // Ejecuto el comando de insercion
                IDataReader reader = cmd.ExecuteReader();
                List<EntidadBase> listaEntidades = cargar(reader);
                if (listaEntidades.Count > 0)
                {
                    return listaEntidades.ElementAt(0);
                }
            }
            catch (DbException dbError)
            {
                throw new DALException("Error de base de datos al intentar guardar entidad.", dbError);
            }
            catch (Exception error)
            {
                throw new DALException("Error inesperado al intentar guardar entidad.", error);
            }
            finally
            {
                if (opened)
                {
                    this.dalObject.Close();
                }
            }

            return null;
        }

        #endregion
    }
}
